-module(starter).
-export([start/1]).
-import(werkzeug, [shuffle/1, logging/2, timeMilliSecond/0, to_String/1, get_config_value/2]).
-import(ggt, [start/3]).

start(StarterNummer) ->
	Nachricht1 = lists:concat(["Starter_", StarterNummer, node(), " Startzeit: ", werkzeug:timeMilliSecond(), " | mit PID ", to_String(self())]),
	log_message(Nachricht1, StarterNummer),

	{_,Handle} = file:consult("../config/ggt.cfg"),
	{_,PraktikumsGruppe} = get_config_value(praktikumsgruppe, Handle),
	{_,Teamnummer} = get_config_value(teamnummer, Handle),
	{_,NameserviceName} = get_config_value(nameservicename, Handle),
	{_,NameserviceNode} = get_config_value(nameservicenode, Handle),
	{_,KoordinatorName} = get_config_value(koordinatorname, Handle),

	log_message("ggt.cfg gelesen...", StarterNummer),

	net_adm:ping(NameserviceNode),%%kennt Node
	timer:sleep(1000),
	Nameservice = global:whereis_name(NameserviceName),%%dienst auf allen bekannten Nodes suchen, s.o.:ping

	log_message("Nameservice gebunden...", StarterNummer),

	Nameservice ! {self(),{lookup,KoordinatorName}},
		receive 
        %%not_found -> io:format("..meindienst..not_found.\n"); 
	        {pin,{Name,Node}} -> 
	        	Koordinator = {Name,Node},
	        	Nachricht2 = lists:concat(["Koordinator ", to_String(Koordinator), "gebunden."]),
	        	log_message(Nachricht2, StarterNummer)
		end,

		Koordinator ! {getsteeringval, self()},
		receive
			{steeringval, ArbZeit, TermZeit, GGTProzesse} -> 
				starteGGTProzesse(Teamnummer, PraktikumsGruppe, ArbZeit, TermZeit, GGTProzesse, StarterNummer),
				Nachricht3 = lists:concat(["getsteeringval: ", ArbZeit, " Arbeitszeit ggT; ", TermZeit, " Wartezeit ggT; ", GGTProzesse, " Anzahl GGT Prozesse."]),
				log_message(Nachricht3, StarterNummer)
		end.

starteGGTProzesse(_, _, _, _, 0, _) -> ok;
starteGGTProzesse(Teamnummer, PraktikumsGruppe ,ArbZeit, TermZeit, GGTProzesse, StarterNummer) ->
	PName = lists:concat([Teamnummer,PraktikumsGruppe, GGTProzesse, StarterNummer]),
	spawn(fun() -> ggt:start(list_to_atom(PName), ArbZeit, TermZeit) end),
	starteGGTProzesse(Teamnummer, PraktikumsGruppe, ArbZeit, TermZeit, GGTProzesse-1, StarterNummer).

log_message(Nachricht, StarterNummer) ->
	{_,Hostname} = inet:gethostname(),
	logging(lists:concat(["../logs/ggt ", StarterNummer,"@", Hostname, ".log"]), lists:concat([Nachricht,"\n"])).